{
	//这里let [a, b, c]表示定义了用于数组解构的三个变量a, b, c
	let [a,b,c] = [1,2,3];
	console.log(a,b,c);  //1,2,3
	let [[f]] = [[1]];
	console.log(f);  //1
	//解构采取贪婪匹配原则，尽量解构更多的数据，
	//并且即使模式不是完全匹配，也能部分解构成功
	let [m,n,v]=[5,6];
	console.log(m,n,v);  //5,6,undefined
	
	//（…）运算符会收录匹配到的其余数据进一个数组，
	//但其必须出现在末尾，否则会报错
	let [e,...tail] = [1,2,3,4];
	console.log(e,tail);  //1,[2,3,4]
	
	//在进行对数组的解构赋值时，等号右边必须是可遍历的解构，
	//比如说数组，Set集合，甚至Generator对象
}

{
	//交换h,z变量的值,不再需要中间变量
	let h=1,z=2;
	[h,z]=[z,h];
	console.log(h,z);  //2,1
}

{
	//函数返回值赋值
	function test(){
		return [7,8];
	}
	let [a,b]=test();//不再需要变量接受,根据索引赋值
	console.log(a,b);//7,8
}

{
	//选择获取函数返回值
	function test(){
		return [1,2,3,4,5];
	}
	let [a,,,,b]=test();//顺序对应,只取第一个和第五个
	console.log(a,b);  //1,5
}

{
	//函数返回值不确定
	function test(){
		return [1,2,3,4,5];
	}
	let [a,...b]=test();//只取第一个,其余的放到一个变量中
	console.log(a,b);  //1,[2,3,4,5]
}

{
	//默认值,当右值数组成员严格等于undefined时，默认值才会生效
	let [a=1,b=2]=[5];
	console.log(a,b); //5,2
	
	//默认值也可以引用解构变量的其它值，但引用的值必须在引用之前被声明
	let [x,y=x]=[0];
	console.log(x,y); //0,0
	
	//如果默认值是表达式，它的求值方式是惰性的，
	//只有需要使用默认值的时候，才进行计算
	function foo(){
    	console.log('fooing');
    	return 'foo'
    };
	let [p = foo()] = [];  // 会执行foo函数,fooing

	let [q = foo()] = ['bar']; // 不会执行foo函数,不输出
}

{
	//字符串在解构时会被转化成一个类似数组的对象，因此可以用于数组的解构赋值
	let [a, b, c] = 'hello';
	console.log(a,b,c); //h,e,l
	//字符串拥有length属性，我们也可以使用对象的解构赋值来获得之，
	//此时字符串hello会被包装成一个对象
	let {length} = 'hello'
	console.log(length); //5
}

{
	//定义变量,即左边的变量名与右边的属性名相同，就可以取得正确的值
	let {h,z}={h:'hou',z:'zheng'};
	console.log(h,z);  //hou,zheng
	//属性名与变量名不同
	let {yao:name}={yao:'yaozhen'};
	console.log(name);//给name变量赋值对象的yao属性值
	//上面let {h,z}其实是下面形式的简写，
	//因为它们的属性名和变量名是相同的。真正被赋值的其实是后者
	//let {h:h,z:h}={h:'hou',z:'zheng'};
	
	//对于已经声明的变量进行解构赋值
	let a;
	//{a}={a:'1'};//会报错
	//这是因为大括号写在了首行，JS引擎会把它当成一个代码块，
	//解决办法很简单，加上()就可以了：不推荐使用
	({a}={a:'1'})
	console.log(a); //1
	
	//默认值   变量名与属性名相同和不同的情况
	let {foo='bbb',bar:baz='aaa'} = {foo:'foo',bar:'bar'};
}

{
	//嵌套解构
	let data={//模拟请求回来的json数据
		title:'info',
		num:[{
			name:'houzheng',
			age:23
		},{
			name:'姚振',
			age:24
		}]
	};
	let {title:yzTitle,num:[{name:N},{name:Name,age:Age}]}=data;
	console.log(yzTitle,N,Name,Age);//info houzheng 姚振 24
}
